package com.adisi.bd;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import com.adisi.objetos.Alerta;
import com.adisi.objetos.Documento;
import com.adisi.objetos.Chofer;
import com.adisi.objetos.EstadoAlerta;
import com.adisi.objetos.TipoDocumento;

public class ChoferDatos {

	public List<Chofer> conseguirTodosLosChoferes(boolean disponibles) {
		AlertaDatos ad = new AlertaDatos();
		List<Chofer> choferes = new ArrayList<Chofer>();
		
		Connection con = null;
		Coneccion coneccion = new Coneccion();
		ResultSet rs = null;
		
		CallableStatement sp = null;
		
		try {
			con = coneccion.conectar();
			
			if(disponibles)
				sp = con.prepareCall("{call sp_Chofer_Select_All_2}");
			else
				sp = con.prepareCall("{call sp_Chofer_Select_All}");
			
			sp.execute();
			
			rs = sp.getResultSet();
			
			
			while (rs.next()) {
				Documento doc = new Documento(TipoDocumento.fromInt(rs.getInt("id_tipo_documento")), rs.getString("numero_documento"));
				
				ArrayList<Alerta> alertas = ad.conseguirTodasLasAlertas("Chofer", rs.getInt("id_chofer"), null, EstadoAlerta.ACTIVA);
				
				Documento lic= new Documento(TipoDocumento.REGISTRO, rs.getString("registro"));
				for(Alerta alerta : alertas) {
					if(alerta.getMotivoAlerta().equals("Licencia"))
						lic.setVencimiento(alerta.getFechaAlerta());
				}				
				
				Chofer chofer = new Chofer(
						rs.getInt("id_chofer"), 
						rs.getString("nombre"), 
						rs.getString("apellido"),
						doc,
						rs.getString("correo"),
						rs.getString("telefono"),
						(rs.getInt("gps")==1),
						lic,
						rs.getString("imei")
						);

				chofer.setAlertas(alertas);
				
				choferes.add(chofer);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			try {
				rs.close();
				sp.close();
				con.close();
			} catch (SQLException e) {
				System.out.println("problema al cerrar");
			}
		}
		
		return choferes;

	}

	public int guardarChofer(Chofer chofer) {
		
		Connection con = null;
		
		Coneccion coneccion = new Coneccion();
		
		CallableStatement sp = null;
		
		int ok = 0;
		
		try {
			
			con = coneccion.conectar();
			
			if(chofer.getIdChofer()!=0){
				
				sp = con.prepareCall("{call sp_Chofer_Update(?,?,?,?,?,?,?,?,?,?)}");
				
				sp.setInt("id_chofer", chofer.getIdChofer());
				sp.setString("nombre", chofer.getNombre());
				sp.setString("apellido", chofer.getApellido());
				if(chofer.getDocumento().getTipo()!=null){
					sp.setInt("id_tipo_documento", chofer.getDocumento().getTipo().ordinal());
					sp.setString("numero_documento", chofer.getDocumento().getNumero());
				}
				else {
					sp.setInt("id_tipo_documento", -1);
					sp.setString("numero_documento", "");
				}
				
				sp.setString("correo", chofer.getCorreo());
				sp.setString("telefono", chofer.getTelefono());
				if( chofer.tieneGPS()) {
					sp.setInt("gps", 1);
					sp.setString("imei", chofer.getImei());
				} else {
					sp.setInt("gps", 0);
					sp.setNull("imei", java.sql.Types.VARCHAR);
				}
				
				sp.setString("registro", chofer.getLicencia().getNumero());
				
				sp.execute();
				
				ok = chofer.getIdChofer();
			} else {
				
				sp = con.prepareCall("{? = call sp_Chofer_Insert(?,?,?,?,?,?,?,?,?)}");
				
				sp.registerOutParameter(1, java.sql.Types.INTEGER);
				
				sp.setString("nombre", chofer.getNombre());
				sp.setString("apellido", chofer.getApellido());
				if(chofer.getDocumento()!=null && chofer.getDocumento().getTipo()!=null){
					sp.setInt("id_tipo_documento", chofer.getDocumento().getTipo().ordinal());
					sp.setString("numero_documento", chofer.getDocumento().getNumero());
				} else {
					sp.setNull("id_tipo_documento", java.sql.Types.INTEGER);
					sp.setNull("numero_documento", java.sql.Types.VARCHAR);
				}
				sp.setString("correo", chofer.getCorreo());
				sp.setString("telefono", chofer.getTelefono());
				if( chofer.tieneGPS()) {
					sp.setInt("gps", 1);
					sp.setString("imei", chofer.getImei());
				} else {
					sp.setInt("gps", 0);
					sp.setNull("imei", java.sql.Types.VARCHAR);
				}
				sp.setString("registro", chofer.getLicencia().getNumero());

	
				
				sp.execute();
				
				chofer.setId(sp.getInt(1));
				
				ok = sp.getInt(1);
				
			}
			
			
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				sp.close();
				con.close();
			} catch (SQLException e) {
				System.out.println("problema al cerrar");
			}
		}
		return ok;
	}

	public boolean borrarChofer(int id_chofer) {
		
		boolean resp = true;
		
		Connection con = null;
		
		Coneccion coneccion = new Coneccion();
		
		CallableStatement sp = null;
		
		try {
			
			con = coneccion.conectar();
			
					
			sp = con.prepareCall("{call sp_Chofer_Delete(?)}");
			
			sp.setInt("id_chofer", id_chofer);
			
			sp.execute();
			
			
			
		} catch (SQLException e) {
			resp = false;
			e.printStackTrace();
		} finally {
			try {
				sp.close();
				con.close();
			} catch (SQLException e) {
				System.out.println("problema al cerrar");
			}
		};
		
		return resp;
	}

	public Chofer conseguirUnChofer(int choferId) {

		AlertaDatos ad = new AlertaDatos();
		
		Connection con = null;
		Coneccion coneccion = new Coneccion();
		ResultSet rs = null;
		
		CallableStatement sp = null;
		
		Chofer chofer = null;
		
		try {
			con = coneccion.conectar();
			
			
			sp = con.prepareCall("{call sp_Chofer_Select_x_Id(?)}");
			sp.setInt(1, choferId);
			
			sp.execute();
			
			rs = sp.getResultSet();
			
			
			while (rs.next()) {
				Documento doc = new Documento(TipoDocumento.fromInt(rs.getInt("id_tipo_documento")), rs.getString("numero_documento"));
								
				ArrayList<Alerta> alertas = ad.conseguirTodasLasAlertas("Chofer", rs.getInt("id_chofer"), null, EstadoAlerta.ACTIVA);
				
				Documento lic= new Documento(TipoDocumento.REGISTRO, rs.getString("registro"));
				for(Alerta alerta : alertas) {
					if(alerta.getMotivoAlerta().equals("Licencia"))
						lic.setVencimiento(alerta.getFechaAlerta());
				}				
				
				chofer = new Chofer(
						rs.getInt("id_chofer"), 
						rs.getString("nombre"), 
						rs.getString("apellido"),
						doc,
						rs.getString("correo"),
						rs.getString("telefono"),
						(rs.getInt("gps")==1),
						lic,
						rs.getString("imei")
						);
				
				chofer.setAlertas(alertas);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				rs.close();
				sp.close();
				con.close();
			} catch (SQLException e) {
				System.out.println("problema al cerrar");
			}
		}

		return chofer;
		
	}

	public Chofer conseguirUnChofer(String imei) {

		AlertaDatos ad = new AlertaDatos();
		
		Connection con = null;
		Coneccion coneccion = new Coneccion();
		ResultSet rs = null;
		
		CallableStatement sp = null;
		
		Chofer chofer = null;
		
		try {
			con = coneccion.conectar();
			
			
			sp = con.prepareCall("{call sp_Chofer_Select_x_Imei(?)}");
			sp.setString("imei", imei);
			
			sp.execute();
			
			rs = sp.getResultSet();
			
			
			while (rs.next()) {
				Documento doc = new Documento(TipoDocumento.fromInt(rs.getInt("id_tipo_documento")), rs.getString("numero_documento"));
								
				ArrayList<Alerta> alertas = ad.conseguirTodasLasAlertas("Chofer", rs.getInt("id_chofer"), null, EstadoAlerta.ACTIVA);
				
				Documento lic= new Documento(TipoDocumento.REGISTRO, rs.getString("registro"));
				for(Alerta alerta : alertas) {
					if(alerta.getMotivoAlerta().equals("Licencia"))
						lic.setVencimiento(alerta.getFechaAlerta());
				}				
				
				chofer = new Chofer(
						rs.getInt("id_chofer"), 
						rs.getString("nombre"), 
						rs.getString("apellido"),
						doc,
						rs.getString("correo"),
						rs.getString("telefono"),
						(rs.getInt("gps")==1),
						lic,
						rs.getString("imei")
						);
				
				chofer.setAlertas(alertas);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				rs.close();
				sp.close();
				con.close();
			} catch (SQLException e) {
				System.out.println("problema al cerrar");
			}
		}

		return chofer;
		
	}
	
}
